package com.nmgolden.lanxin.model;

import lombok.Data;

import java.util.List;
import java.util.Map;

/**
 * @author siger
 * @created 2024/5/18
 * @updated 2024/5/18
 */
@Data
public class CreateUserRequestBody {

    /**
     * 人员所在组织Id
     */
    private String orgId;

    /**
     * 人员姓名
     */
    private String name;

    /**
     * 登录方式：0-手机号、 1-邮箱、 2-账密。不填时默认手机号且手机号不能为空。
     * 目前每个人支持多种登录方式。（注：平台服务版本低于3.8时，每个人仅支持一种登录方式）
     * 特别说明：如果指定账密登录方式时，需要通过超级管理员在对应的组织上创建一个组织标识。
     */
    private List<Integer> loginWays;

    /**
     * 账密登录方式的登录账号，指定账密方式登录时loginWays不能为空。创建后不可修改，组织内必须唯一。
     * 特别说明：如果指定登录方式为账密登录时（loginWays=2），需要通过超级管理员在对应的组织上创建一个组织标识，例如:zzbs。
     */
    private String loginName;

    /**
     * 登录方式为账密登录时，需设置账户的登录密码，不能为空。为避免密码泄漏，
     * 要求原始密码使用哈希算法计算哈希值后再填充该字段，具体哈希算法需要联系组织管理员确认(算法为组织配置，例如SHA256)。
     */
    private String loginPassword;

    /**
     * 手机号码，loginWays指定手机号登录时不能为空，组织内必须唯一。
     */
    private Phone mobilePhone;

    /**
     * 是否发送短信邀请
     * 注：集中同步大量人员时，不建议发送邀请短信，否则会造成同步接口调用失败率升高和速度降低。
     */
    private boolean smsInvitation;

    /**
     * 是否发送邮件邀请
     * 注：集中同步大量人员时，不建议发送邀请邮件，否则会造成同步接口调用失败率升高和速度降低。
     */
    private boolean emailInvitation;

    /**
     * 邮件或短信邀请中是否包含账户和密码信息
     */
    private boolean sendAccountInfo;

    /**
     * 人员号，组织内唯一，和系统已有人员号冲突时接口返回数据冲突错误
     */
    private String employeeNumber;

    /**
     * 性别：0-保密、1-男、2-女。
     */
    private int gender;

    /**
     * 人员头像
     */
    private String avatarId;

    /**
     * 电子邮箱地址，loginWays指定邮箱登录时不能为空，组织内唯一，和系统已有邮箱地址冲突时接口返回数据冲突错误。
     */
    private String email;

    /**
     * 人员个人签名
     */
    private String signature;

    /**
     * 民族
     */
    private String nationality;

    /**
     * 出生日期。格式：yyyy-mm-dd
     */
    private String birthdate;

    /**
     * 附加联系方式
     */
    private List<Phone> extraPhones;

    /**
     * 个人介绍
     */
    private Introduction introduction;

    /**
     * 受教育履历
     */
    private List<Education> education;

    /**
     * 工作履历
     */
    private List<Career> career;

    /**
     * 自定义扩展属性，k代表扩展字段ID，这个ID由管理后台预定义，应用可以通过以下接口获取通讯录扩展字段ID列表。
     */
    private Map<String, String> extraFieldSet;

    /**
     * 是否禁用密码重置。禁用 - true，不禁用 - false (默认)
     */
    private boolean disablePasswordReset;

    /**
     * 人员（办公）地址
     */
    private String address;

    /**
     * 人员所在分支
     */
    private List<Department> departments;

    /**
     * 身份证号
     */
    private String idNumber;

    /**
     * 籍贯
     */
    private String nativePlace;

    /**
     * 职务
     */
    private String duties;

    /**
     * 党派
     */
    private String parties;

    /**
     * 人员标签信息
     */
    private List<String> tags;

    /**
     * 人员外部ID，组织通讯录数据源唯一标识人员的ID。注意，如果是账号密码方式登录，应该使用loginName字段。
     * 如果是手机号方式登录，又想保留企业内的人员唯一ID，可以使用该externalId字段。
     * externalId 和 employeeNumber类似，用于组织内人员的唯一标识。创建后不可修改，组织内必须唯一。
     */
    private String externalId;


    @Data
    public static class Phone {
        /**
         * 国家码
         */
        private String countryCode;

        /**
         * 电话号码
         */
        private String number;

    }

    @Data
    public static class Department {
        /**
         * 分支ID
         */
        private String id;

        /**
         * 人员在分支中的排序。排序不确定时可填0，服务端有效值从1开始。
         */
        private int orderNumber;

        /**
         * 分支排序
         */
        private int departmentOrder;

        /**
         * 人员在分支中的职务
         */
        private List<String> extraDuties;

    }

    @Data
    public static class Introduction {
        /**
         * 个人介绍-描述
         */
        private String introduction;

        /**
         * 个人介绍-图片
         */
        private List<String> mediaIds;

    }

    @Data
    public static class Education {
        /**
         * 教育机构名称
         */
        private String unit;

        /**
         * 受教育描述
         */
        private String description;

        /**
         * 开始日期，日期格式：yyyy-mm-dd
         */
        private String startDate;

        /**
         * 结束日期，日期格式：yyyy-mm-dd
         * corrected from endData to endDate
         */
        private String endDate;

    }

    @Data
    public static class Career {
        /**
         * 工作单位
         */
        private String unit;

        /**
         * 工作描述
         */
        private String description;

        /**
         * 开始日期，日期格式：yyyy-mm-dd
         */
        private String startDate;

        /**
         * 结束日期，日期格式：yyyy-mm-dd
         * corrected from endData to endDate
         */
        private String endDate;

    }
}